package cn.com.liu.f_sequenceFlow;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class SequenceFlowTest {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	/**部署流程定义*/
	@Test
	public void deploymentProcessDefinition(){
		InputStream inputStreamBpmn=this.getClass().getResourceAsStream("sequenceFlow.bpmn");
		InputStream inputStreamPng=this.getClass().getResourceAsStream("sequenceFlow.png");
		Deployment deployment=processEngine.getRepositoryService()//与流程定义和部署相关的service
		.createDeployment()//创建一个部署对象
		.name("连线")
		.addInputStream("sequenceFlow.bpmn", inputStreamBpmn)//使用资源文件的名称（要求:与资源文件的名称要一致）和输入流完成部署载一个文件
		.addInputStream("sequenceFlow.png", inputStreamPng)//使用资源文件的名称（要求:与资源文件的名称要一致）和输入流完成部署载一个文件
		.deploy();//完成部署
		
		System.out.println("部署ID："+deployment.getId());
		System.out.println("部署名称："+deployment.getName());
	}
	
	/**启动流程实例*/
	@Test
	public void startProcessInstance(){
		String processDefinitionKey="sequenceFlowProcess";
		ProcessInstance pi=processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的service
		.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例，key对应helloworld.bpmn文件中id的属性值，使用key值启动，默认是按照最新版本的流程定义启动
	System.out.println("流程实例ID："+pi.getId());
	System.out.println("流程定义ID："+pi.getProcessDefinitionId());
	}
	
	/**查询当前人的个人任务*/
	@Test
	public void findMyPersonTask(){
		String assignee="田七";
		List<Task> list=processEngine.getTaskService()//与正在执行的任务相关的service
		.createTaskQuery()//创建任务查询对象
		.taskAssignee(assignee)//指定个人任务查询，指定办理人
		.list();
		
		if(list!=null&&list.size()>0){
			for (Task task : list) {
				System.out.println("任务id："+task.getId());
				System.out.println("任务名称："+task.getName());
				System.out.println("任务创建时间："+task.getCreateTime());
				System.out.println("任务办理人："+task.getAssignee());
				System.out.println("流程实例ID："+task.getProcessInstanceId());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义id:"+task.getProcessDefinitionId());
				
				System.out.println("********************************************");
			}
		}
	}
	
	/**完成我的任务*/
	@Test
	public void completeMyPersonTask(){
		String taskId="3903";
		//完成任务的同时设置流程变量，使用流程变量来指定下一个任务完成后，下一个连线，对应sequenceFlow.bpmn文件中${message=='不重要'}
		Map<String, Object> variables=new HashMap<String, Object>();
		variables.put("message", "重要");
		processEngine.getTaskService()//与正在执行的任务相关的service
		.complete(taskId, variables);
		System.out.println("完成任务，任务ID："+taskId);
	}
}
